# Parser Vedabase
from bs4 import BeautifulSoup as bs
import bs4
import requests
import time


def __get_soup(url) -> bs4.BeautifulSoup:
    '''Returns soup from site page'''
    while True:  # повтор запроса к странице после ожидания, если сервер закрыает соединение
        try:
            r = requests.get(url)
        except requests.exceptions.RequestException:
            time.sleep(30)
        else:
            break
    r.encoding = 'utf-8'
    return bs(r.text, 'html.parser')



def __construct_link(query: str) -> dict:
    basic_url = 'https://vedabase.io'
    books = ['bg', 'sb']
    try:
        book_name, verse_number = query.split(" ")
    except ValueError:
        return {"error": "Не правильный формат указания стиха"}
    if book_name not in books:
        return {"error": "Книга указана не правильно. Введите одно из\
 bg, sb"}
    return {
            "link": basic_url + f"/ru/library/{book_name}/{verse_number.replace('.', '/')}"
            }

# getting data

def get_full_verse(query: str) -> dict:
    """Получает текст стиха или нескольких стихов. Возвражает в объекте, жанные о стихе и в массиве тексты нескольких стихов"""
    verses = []
    parsed_query = __construct_link(query)
    if 'error' in parsed_query:
        return {'error': parsed_query['error']}
    url = parsed_query['link']
    soup = __get_soup(url)
    title = soup.title.text
    if title == '':
        return {'error': [f'Стих либо не найден либо какая-то другая ошибка']}
    title = title.replace('Бг.', 'Бхагавад-гита')
    try:
        verse_text = soup.find(
            'div', class_='wrapper-verse-text').find_all(class_='r-verse-text')

        if len(verse_text) > 1:
            verse_number = int(title.split('.')[-1].split('-')[0])
            title_template = ".".join(title.split('.')[:-1])

            for v in verse_text:
                text = v.get_text('\n', strip=True)
                verses.append({
                    "text": text,
                    "title": f"{title_template}.{verse_number}",
                    "alias": f"{'.'.join(query.split('.')[:-1])}.{verse_number}"
                    })
                verse_number += 1
        else:
            verses.append({
                "text": verse_text[0].get_text('\n', strip=True),
                "title": title,
                "alias": query})
    except Exception:
        return {'error': ['Не найдено']}
    with open('lastverse', 'w') as f:
        f.write(query)

    return {
        'link': url,
        'verses': verses,
    }

